﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using Sistema_Totem.Presentacion.Contrato.Proyectos;
using Sistema_Totem.Clases;
using Sistema_Totem.Logica.Comandos.ComadoProyecto;
using Sistema_Totem.Logica.Fabricas;
using Sistema_Totem.Logica.Comandos;
using Sistema_Totem.Clases.Fabricas;


namespace Sistema_Totem.Presentacion.Presentador.Proyectos
{
    public class PresentadorAgregarProyecto
    {

        #region Atributos

        private IContratoAgregarProyecto _vista;
        private string _mensajeError = "Revise los datos suministrados, existio alguno que no llenó";
        private string _mensajeErrorFechas = "La fecha de inicio del proyecto no puede ser mayor que la de fin";
        private string _mensajeErrorInsercion = "Hubo un momento en el error de la ejecución del comando";
        private string _mensajeExito = "Proyecto Agregado!";
        private Entidad _proyecto = FabricaEntidad.CrearProyecto();
        private Comando<bool> _comando;
        private List<Entidad> _clientes = new List<Entidad>(), _involucrados = new List<Entidad>();

        #endregion Atributos

        #region Constructor

        public PresentadorAgregarProyecto(IContratoAgregarProyecto _vista)
        {
            this._vista = _vista;            
        }

        #endregion Constructor

        #region Métodos.

        public void pintarComboClientes()
        {
            _vista.Clientes.Items.Add("- Indique opcion: ");
            _clientes = FabricaComando.CrearComandoConsultarTodosLosClientes().Ejecutar();

            foreach (Entidad _cliente in _clientes)            
                _vista.Clientes.Items.Add((_cliente as Cliente).Nombre + ":" + (_cliente as Cliente).Rif);
            
        }

        public void pintarListadoInvolcradosSistema()
        {
            _involucrados = FabricaComando.CrearComandoConsultarTodosLosInvolucrados().Ejecutar();

            foreach (Entidad _involucrado in _involucrados)
                _vista.InvolucradosSistema.Items.Add((_involucrado as Involucrado).Nombre);

        }
        /// <summary>
        /// Método que va a realizar la llamada al comando de agregar proyecto
        /// El mismo ha de ejecutarse si el formulario fue correctamente lleno.
        /// </summary>
        
        public void AgregarProyecto()
        {
            //Se valida si el formulario se lleno correctamente.

            if (ValidarFormulario())
            {
                //Posterior a que este bueno, se validan las fechas.

                if (ValidarFechasProyecto())
                {
                    //Creamos el proyecto nuevo.

                    (_proyecto as Proyecto).Codigo = "";
                    (_proyecto as Proyecto).Nombre = _vista.NombreProyecto.Text;
                    (_proyecto as Proyecto).Descripcion = _vista.DescripcionProyecto.Text;
                    (_proyecto as Proyecto).FechaIni = _vista.CalendarioFechaInicio.SelectedDate;
                    (_proyecto as Proyecto).FechaFin = _vista.CalendarioFechaFin.SelectedDate;
                    (_proyecto as Proyecto).Estado = "Activo";
                    (_proyecto as Proyecto).Area = _vista.AreaProyecto.Text;

                    //Obtenemos el comando de agregar proyecto desde la fabrica.

                    _comando = FabricaComando.CrearComandoAgregarProyecto(_proyecto,_vista.Sesion["usuario"] as Usuario);

                    if (_comando.Ejecutar())
                    {
                        _vista.MensajeError.Visible = false;
                        _vista.MensajeConfirmacion.Text = _mensajeExito;
                        _vista.MensajeConfirmacion.Visible = true;
                        _vista.NombreProyecto.Text = "";
                        _vista.AreaProyecto.Text = "";
                        _vista.Clientes.SelectedIndex = 0;
                        _vista.DescripcionProyecto.Text = "";
                    }
                    else
                    {
                        //Si el comando falla, entonces devolvemos mensaje de error

                        _vista.MensajeError.Text = _mensajeErrorInsercion;
                        _vista.MensajeError.Visible = true;
                    }
                                        
                }
                else
                {
                    //Si las fechas son incorrectas, entonces devolvemos mensaje de error

                    _vista.MensajeError.Text = _mensajeErrorFechas;
                    _vista.MensajeError.Visible = true;
                }
            }
            else
            {
                //Si el formulario no esta correctamente lleno, entonces devolvemos mensaje de error

                _vista.MensajeError.Text = _mensajeError;
                _vista.MensajeError.Visible = true;
            }
        }

        /// <summary>
        /// Método que valida el formulario AgregarProyecto.aspx
        /// </summary>
        /// <returns>true = formulario correctamente lleno</returns>
        /// <returns>false = formulario con errores de insercion</returns>
        
        private bool ValidarFormulario()
        {

            if (_vista.NombreProyecto.Text == "" ||
                _vista.Clientes.SelectedIndex == 0 ||
                _vista.AreaProyecto.Text == "" ||
                _vista.DescripcionProyecto.Text == "" ||
                _vista.PlantillasCU.SelectedIndex == 0 ||
                _vista.PlantillasMinuta.SelectedIndex == 0 ||
                _vista.PlantillasPropuesta.SelectedIndex == 0 ||
                _vista.PlantillasErs.SelectedIndex == 0 ||
                _vista.PlantillasRequerimientos.SelectedIndex == 0 ||
                _vista.CalendarioFechaFin.SelectedDate == null ||
                _vista.CalendarioFechaInicio.SelectedDate == null)

                return false;

            return true;
        }

        /// <summary>
        /// Método que valida el rango de fechas del proyecto
        /// </summary>
        /// <returns>true = fecha de inicio menor a fecha fin</returns>
        /// <returns>false = fecha de inicio mayor a la de fin</returns>
        
        private bool ValidarFechasProyecto()
        {
            if (_vista.CalendarioFechaInicio.SelectedDate >= _vista.CalendarioFechaFin.SelectedDate)
                return false;

            return true;
        }

        #endregion Métodos.
    }
}